package cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS会导致ABA问题，当前线程将变量改为B，然后又改为A
 */
public class CASDemo {
    /**
     * CAS compareAndSet:比较并交换
     * @param args
     */
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);
        //对于平时写的sql，我们可以使用乐观锁

        //public final boolean compareAndSet(int expect, int update)
        //如果我期望的值达到了就更新,CAS是Cpu的并发原理
        //如果不是就一直循环，底层是自旋锁。
        //捣乱线程
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());

        System.out.println(atomicInteger.compareAndSet(2021, 2020));
        System.out.println(atomicInteger.get());
//        true
//        2021
//        false
//        2021

        //期望线程，，并不知道2020已经被动过
        System.out.println(atomicInteger.compareAndSet(2020,6666));
        System.out.println(atomicInteger.get());

    }
}
